package main

import "fmt"

// 方法

// 结构体定义
// 标识符：变量名、函数名、方法名、类型名
// 首字母大小表示对外可见（公有的）
// type Dog struct {
// 	name string
// }
type dog struct {
	name string
}

// 构造函数

func newDog(name string) dog {
	return dog{
		name: name,
	}
}

// 方法定义
// 方法是作用于特定类型的函数
// 前面添加调用者（接收者）
// 值接收者
func (d dog) eat() { // 约定俗成用类型首字母小写表示
	fmt.Println("吃狗粮", d.name)
}

// 指针接收者（1、修改接收者的值；2、接收者拷贝代价较大；3、一致性，有一个方法使用了指针接收，其他方法也要用）
func (d *dog) eat2() {
	fmt.Println("吃狗粮", d.name)
}

func main() {
	d1 := newDog("大黄")
	d1.eat()
	d2 := newDog("大黄2")
	d2.eat2()
}
